package uam

import (
	"context"
	"encoding/json"
	"github.com/chromedp/cdproto/network"
	"github.com/chromedp/chromedp"
	"github.com/sirupsen/logrus"
	"strings"
	"time"
)

const (
	// 页面
	adminPage = "/admin/"

	// 接口
	userLogin = "/c/api/public/login"
)

func (s UAMStruct) ajaxCheckEntrance(e *network.EventResponseReceived) {
	logrus.Debug("请求接口：", e.Response.URL[len(s.url):])
	url := e.Response.URL[len(s.url):]
	if !strings.HasPrefix(url, "/") {
		url = "/" + url
	}
	if strings.Contains(url, "url") {
		url = url[:strings.Index(url, "?")]
	}
	switch e.Response.URL[len(s.url):] {
	case userLogin:
		s.userLogin(e)
	default:
		//logrus.Debug("还未处理的接口")
	}
}

func (s UAMStruct) docCheckEntrance(e *network.EventResponseReceived) {
	logrus.Debug("新页面： ", e.Response.URL[len(s.url):])
	url := e.Response.URL[len(s.url):]
	if !strings.HasPrefix(url, "/") {
		url = "/" + url
	}
	switch e.Response.URL[len(s.url):] {
	case adminPage:
		s.adminLogin(e)
	default:
		//logrus.Debug("还未处理的页面")
	}
}

func (s *UAMStruct) userLogin(e *network.EventResponseReceived) {
	// 监听登录行为
	b, err := network.GetResponseBody(e.RequestID).Do(s.ctx)
	var result map[string]interface{}
	err = json.Unmarshal(b, &result)
	if err != nil {
		logrus.Error(err, "接口 c/api/public/login 返回值不是一个json")
	}
	// Golang 使用 JSON unmarshal() 序列化 int 被转成 float64 类型，因此需要强转回来
	//if result["code"].(int) == 101 {
	//	logrus.Debug("需要二次确认登录")
	//}
	if result["token"] == "" {
		err = chromedp.Run(s.ctx,
			chromedp.Sleep(1*time.Second),
			chromedp.Click(`document.getElementsByClassName("ant-btn ant-btn-primary")[0]`, chromedp.ByJSPath),
		)
		if err != nil {
			logrus.Error(err)
		}
		logrus.Debug("点击二次确认登录按钮")
	} else {
		logrus.Debug("获取到token", result["token"])
		s.isLogin = true
		err = chromedp.Run(s.ctx,
			chromedp.WaitVisible(`#app`, chromedp.ByID),
			chromedp.Sleep(1*time.Second),
			chromedp.Click(`document.getElementsByClassName("ant-btn ant-btn-primary ant-btn-background-ghost mx-2")[0]`,
				chromedp.ByJSPath),
		)
		if err != nil {
			logrus.Error(err)
		}
	}
}
func (s *UAMStruct) adminLogin(e *network.EventResponseReceived) {
	err := chromedp.Run(s.ctx,
		chromedp.SetValue(`document.getElementsByClassName("ant-input")[0]`, s.pwd, chromedp.ByJSPath),
		chromedp.Sleep(time.Second*1),
		chromedp.Click(`document.getElementsByClassName("ant-btn ant-btn-primary ant-btn-block btn")[0]`, chromedp.ByJSPath),
		chromedp.ActionFunc(func(ctx context.Context) error {
			logrus.Debug("LoginManagementPage")
			return nil
		}),
	)
	if err != nil {
		logrus.Error(err)
	}
}
